/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-06
 * Time: 22:31
 */
public class Solution {
//     利用矩阵
//     思路:
//     创建 (max)*(n+1)的矩阵, 一列相同的字母往里面靠, 按照字母的个数降序
//     n+1, 是因为相同的字母之间要差一个冷却时间 n, 相当于是在冷却时间里让cpu执行其他字母
//     max, 是因为要以数目最多的为准
//     最后总结出来的结果
//     max(length, (n+1)*(max-1)+maxCount)
    public int leastInterval(char[] tasks, int n) {
        int[] count=new int[26];// 记录每个字母的个数
        for(char c:tasks){
            count[c - 'A']++;
        }
        int max=0;// 记录最多的字母数
        for(int i=0;i<26;i++){
            max=Math.max(max, count[i]);
        }
        int maxCount=0;// 记录字母数最多的字母种数
        for(int i=0;i<26;i++){
            maxCount+=max==count[i]?1:0;
        }
        // 最后结果是 (n+1)*(max-1)的矩阵 和 总的字母个数 的最大值
        // 因为只创建了 (n+1)*(max-1)这么大的矩阵, 也有可能字母的种类超过n+1,
        // 这样就可能导致计算的结果比总的字母的个数都少
        return Math.max(tasks.length, (n+1)*(max-1)+maxCount);
    }
}
